package com.quintal.androidtouchcloud.remote.requests;

import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;

import android.os.Environment;
import android.util.Log;

public class UploadPictureServerRequest extends Thread {

	private static final String MODULE = "Upload to server request";
	private File _picture;
	private String _report_id;
	
	/**
	 * Constructor for the File Uploader Class, receives an int that is the installation Id of the device
	 * @param iid - installation Id of the device
	 */
	public UploadPictureServerRequest(File picture, String report){
		_picture = picture;
		_report_id = report;
	}

	public void run(){
		Log.i(MODULE,"starting to upload file "+_picture.getAbsolutePath());
		
		HttpURLConnection conn = null;
		DataOutputStream dos = null;
		DataInputStream inStream = null;
		//String existingFileName = Environment.getExternalStorageDirectory().getAbsolutePath() + "/PowerMeterMobile/pm.sqlite";
		String lineEnd = "\r\n";
		String twoHyphens = "--";
		String boundary =  "*****";
		int bytesRead, bytesAvailable, bufferSize;
		byte[] buffer;
		int maxBufferSize = 1*1024*1024;
		String responseFromServer = "";
		String urlString = "http://aveiro.m-iti.org/touchCloudProxy/UploadHandler/handle_upload.php?report_id="+_report_id;
		Log.i(MODULE, urlString);
		try
		{
			//------------------ CLIENT REQUEST
			FileInputStream fileInputStream = new FileInputStream(_picture);
			// open a URL connection to the Servlet
			URL url = new URL(urlString);
			// Open a HTTP connection to the URL
			conn = (HttpURLConnection) url.openConnection();
			// Allow Inputs
			conn.setDoInput(true);
			// Allow Outputs
			conn.setDoOutput(true);
			// Don't use a cached copy.
			conn.setUseCaches(false);
			// Use a post method.
			conn.setRequestMethod("POST");
			conn.setRequestProperty("Connection", "Keep-Alive");
			conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);
			dos = new DataOutputStream( conn.getOutputStream() );
			dos.writeBytes(twoHyphens + boundary + lineEnd);
			dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\"" + _picture.getAbsolutePath() + "\"" + lineEnd);
			dos.writeBytes(lineEnd);
			// create a buffer of maximum size
			bytesAvailable = fileInputStream.available();
			bufferSize = Math.min(bytesAvailable, maxBufferSize);
			buffer = new byte[bufferSize];
			// read file and write it into form...
			bytesRead = fileInputStream.read(buffer, 0, bufferSize);
			
			while (bytesRead > 0)
			{
				dos.write(buffer, 0, bufferSize);
				bytesAvailable = fileInputStream.available();
				bufferSize = Math.min(bytesAvailable, maxBufferSize);
				bytesRead = fileInputStream.read(buffer, 0, bufferSize);
			}
			// send multipart form data necesssary after file data...
			dos.writeBytes(lineEnd);
			dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
			// close streams
			Log.e("Debug","File uploaded");
			fileInputStream.close();
			dos.flush();
			dos.close();
			
		}
		catch (MalformedURLException ex)
		{
			Log.e("Debug", "error: " + ex.getMessage(), ex);
		}
		catch (IOException ioe)
		{
			Log.e("Debug", "error: " + ioe.getMessage(), ioe);
		}
		//------------------ read the SERVER RESPONSE
		try {
			inStream = new DataInputStream ( conn.getInputStream() );
			String str;

			while (( str = inStream.readLine()) != null)
			{
				Log.e("Debug","Server Response "+str);
			}
			inStream.close();

		}
		catch (IOException ioex){
			Log.e("Debug", "error: " + ioex.getMessage(), ioex);
		}
	}

}
